Abstract
Questo report rappresenta un’approfondita analisi statistica nel campo del basket professionistico, con un focus specifico sulle prestazioni delle squadre NBA. Utilizzando metodi statistici avanzati, si esplorano diverse metriche chiave per comprendere meglio le dinamiche del gioco e i fattori che influenzano il successo delle squadre.df$games == 82). Questo criterio
assicura l’uniformità e la comparabilità dei dati analizzati.In questo report, ci siamo concentrati sull’elaborazione di un modello lineare predittivo per determinare il numero di vittorie in funzione dei rimbalzi annuali effettuati dalle squadre nella NBA. Il modello si applica esclusivamente a squadre che hanno disputato almeno 82 partite per stagione, considerando un arco temporale che va dal 1976 al 2011.
L’approccio del modello lineare si basa sull’adozione di coefficienti accuratamente selezionati, mirati a massimizzare la significatività e l’aderenza alla nostra interpretazione dell’impatto di specifiche variabili sulle vittorie. Questi coefficienti sono stati scelti in modo da riflettere al meglio la nostra concezione di quali fattori influenzino maggiormente il successo delle squadre.
Ulteriori informazioni riguardanti l’esecuzione del programma e l’utilizzo della funzione predittiva sono fornite nei paragrafi successivi, dove viene anche descritto il processo di sviluppo e validazione del modello.
Il chunk riportato legge un dataset da un file, filtra le righe in base ai criteri sopra riportati, calcola una nuova variabile e offre la possibilità di ottenere un riassunto statistico dei dati filtrati.
# Leggi il dataset da un file di testo
filepath <- here("0_Materiale", "basketball_teams.txt")
dataset <- read.delim(filepath)
# Definisci il primo e l'ultimo anno del range da considerare per lo studio
FIRST <- 1976
LAST <- 2011
# Filtra il dataset secondo le condizioni specificate
df <- dataset[dataset$lgID == "NBA" & dataset$year >= FIRST & dataset$year <= LAST & dataset$games == 82,]
# Converti la colonna lgID in un fattore per consentire la generazione di variabili dummy
dataset$lgID <- as.factor(dataset$lgID)
La mappa di calore della matrice di correlazione, o “corrplot”, è un metodo visivo efficace per esaminare le relazioni bivariate tra tutte le variabili di un dataset. In questo particolare corrplot, ogni cella rappresenta il coefficiente di correlazione tra le variabili sulle righe e le colonne. Le tonalità di colore variano in base alla forza e alla direzione della correlazione:
L’asse delle ordinate (Y) e l’asse delle ascisse (X) elencano le variabili incluse nel dataset, permettendo di identificare rapidamente quali coppie di variabili mostrano le correlazioni più forti. Ad esempio, una cella chiara sulle diagonali rappresenta la perfetta correlazione positiva di una variabile con sé stessa, mentre le altre celle off-topic permettono di vedere come ogni variabile si relaziona con le altre.
Questa rappresentazione grafica è particolarmente utile per identificare potenziali problemi di multicollinearità in modelli di regressione, dove variabili altamente correlate possono distorcere o influenzare eccessivamente i risultati. Inoltre, può aiutare a scoprire pattern interessanti nei dati che potrebbero meritare ulteriori indagini.
Il grafico presentato è un insieme di box plot, una rappresentazione grafica utilizzata per evidenziare la distribuzione e la variabilità delle vittorie per diverse squadre sportive, ognuna codificata con un colore distinto. Il box plot visualizza cinque statistiche descrittive principali: il minimo, il primo quartile (Q1), la mediana, il terzo quartile (Q3) e il massimo. La linea che attraversa il box rappresenta la mediana, il valore centrale del dataset. Le “antenne” si estendono dal box fino ai valori minimi e massimi esclusi gli outliers, che sono rappresentati come punti individuali. Questo tipo di grafico è particolarmente utile per confrontare le distribuzioni tra più gruppi e per identificare eventuali deviazioni significative dalla norma.
Dall’analisi del box plot si osserva un’ampia variazione nel numero di vittorie tra le squadre. Alcune squadre dimostrano una maggiore coerenza nelle prestazioni, come evidenziato da box più stretti, mentre altre presentano una maggiore dispersione dei risultati, suggerendo una variabilità significativa nelle loro prestazioni durante la stagione. Gli outliers indicano delle prestazioni eccezionali o sotto la media rispetto al resto del campione. La mediana di ciascuna squadra offre una valutazione robusta delle loro prestazioni tipiche escludendo l’influenza di tali valori anomali.
Il secondo grafico è un diagramma di densità, il quale fornisce una stima continua della distribuzione di probabilità delle vittorie complessive. La linea curva riflette la densità di probabilità, dove picchi più alti corrispondono a un numero maggiore di osservazioni vicine a un particolare valore. La linea rossa verticale indica la media delle vittorie, fornendo un punto di riferimento per la posizione centrale della distribuzione.
Osservando il diagramma di densità, si nota che la distribuzione delle vittorie complessive assume una forma approssimativamente simmetrica attorno alla media, indicata dalla linea rossa verticale. Questo suggerisce che, per il campione in esame, le vittorie sono distribuite in modo relativamente uniforme intorno al valore medio, con una tendenza a seguire una distribuzione normale. Tale simmetria e il picco pronunciato attorno alla media possono implicare che le prestazioni delle squadre tendono a raggrupparsi intorno a un ‘valore tipico’, con deviazioni che seguono un modello prevedibile.
Nel nostro dataframe sono incluse variabili specifiche per analizzare in dettaglio il ruolo dei rimbalzi nel basket. Ecco una descrizione degli acronimi utilizzati:
Gli istogrammi delle variabili (di cui abbiamo approssimato la curva di densità) che ora vediamo rappresentano la distribuzione dei dati per diverse variabili, mostrando la frequenza o la probabilità di osservazione entro intervalli specifici. Le curve di densità forniscono una stima continua della distribuzione di probabilità e sono spesso confrontate con una distribuzione normale, indicata qui da una linea rossa.
Dai grafici osservati, è possibile trarre conclusioni riguardo la normalità della distribuzione dei dati per ciascuna variabile. Se la curva di densità blu segue da vicino la linea rossa della distribuzione normale, ciò implica che i dati di quella variabile potrebbero essere ben modellati da una distribuzione normale. Deviazioni significative da questa linea potrebbero indicare asimmetria o presenza di outlier. Tali informazioni sono vitali per la scelta di test statistici appropriati e per la comprensione delle caratteristiche fondamentali dei dati analizzati.
Viene calcolata la percentuale di valori non zero per ciascuna variabile di interesse all’interno del dataframe df_reb, serve per verificare ulteriormente la consistenza dei dati acquisiti.
## Percentuale di valori non-zero in o_oreb: 100%
## Percentuale di valori non-zero in o_dreb: 100%
## Percentuale di valori non-zero in o_reb: 100%
## Percentuale di valori non-zero in d_oreb: 100%
## Percentuale di valori non-zero in d_dreb: 100%
## Percentuale di valori non-zero in d_reb: 100%
Il grafico presentato è una combinazione di heatmap e dendrogramma. La heatmap è una rappresentazione visiva dei dati dove i valori individuali contenuti in una matrice sono rappresentati come colori. In questo caso i colori rappresentino il numero totale dei rimbalzi (offensivi e difensivi) delle squadre, mentre i dendrogrammi ai lati rappresentano una gerarchia di clustering basata sulla somiglianza delle prestazioni tra le squadre. Questo tipo di visualizzazione permette di identificare rapidamente modelli, come gruppi di squadre con prestazioni simili, e correlazioni tra i diversi tipi di rimbalzi.
L’analisi della heatmap e del dendrogramma indica l’esistenza di distinti gruppi di squadre che mostrano pattern simili nei rimbalzi. I cluster formati nel dendrogramma evidenziano relazioni che non sarebbero immediatamente ovvie senza questa forma di analisi gerarchica. Le gradazioni di colore nella heatmap offrono una visione intuitiva dell’intensità dei rimbalzi: colori più caldi indicano un numero maggiore di rimbalzi, mentre colori più freddi ne indicano di meno. Questo permette di identificare facilmente le squadre con prestazioni eccezionali o sottotono.
Il secondo grafico è un diagramma a barre sovrapposte che confronta due variabili categoriche: i rimbalzi offensivi e difensivi per ogni squadra, rappresentati con colori distinti. Le barre verticali mostrano il numero totale di rimbalzi per ciascuna squadra, permettendo di comparare direttamente i rimbalzi offensivi con quelli difensivi.
L’esame del grafico a barre sovrapposte non rivela variazioni significative nel rapporto tra rimbalzi offensivi e difensivi tra le squadre, mostrando una tendenza all’auto-bilanciamento tra le due.
Il terzo grafico è un diagramma di densità che confronta la distribuzione totale dei rimbalzi con una distribuzione normale ideale. La densità è mostrata dalla curva blu, mentre la distribuzione normale ideale è rappresentata dalla linea verde (con area sottostante). La linea rossa tratteggiata indica la media dei rimbalzi totali.
Analizzando il diagramma di densità, si osserva che la distribuzione dei rimbalzi totali segue abbastanza fedelmente una distribuzione normale, come indicato dalla sovrapposizione delle due curve. La media, indicata dalla linea rossa, cade quasi al centro della curva di densità, suggerendo che la maggior parte delle squadre ha un numero di rimbalzi vicino alla media del campione.
L’ultimo grafico è un insieme di box plot, simile al primo grafico condiviso, ma questa volta per rimbalzi offensivi e difensivi. Ogni squadra è rappresentata da due box plot adiacenti, uno per i rimbalzi offensivi (o_reb) e uno per i rimbalzi difensivi (d_reb), permettendo un confronto immediato tra le due metriche per ogni squadra.
Il grafico mostra che c’è variabilità sia nei rimbalzi offensivi sia in quelli difensivi tra le diverse squadre. Si notano differenze nella mediana, nella variabilità e nella presenza di valori anomali (outliers), il che potrebbe indicare diverse efficacie o stili di gioco. Ad esempio, alcune squadre potrebbero avere una forte tendenza ai rimbalzi difensivi ma meno capacità nei rimbalzi offensivi, o viceversa, fornendo spunti per ulteriori indagini sulle strategie di gioco.
Il test Anderson-Darling è un test statistico non parametrico,
utilizzato per verificare l’ipotesi che un campione di dati provenga da
una particolare distribuzione, in questo caso, la distribuzione normale.
È particolarmente sensibile alle deviazioni nella coda della
distribuzione.
- Range: 0 a \(+\infty\)
- Interpretazione: Valori più bassi indicano una
maggiore aderenza alla distribuzione normale. Si confronta il valore di
test con valori critici specifici per determinare se rifiutare l’ipotesi
di normalità.
# Questo codice esegue il test di Anderson-Darling sulla variabile 'reb' nel tuo dataset (df)
ad.test(df$reb)
##
## Anderson-Darling normality test
##
## data: df$reb
## A = 3.6997, p-value = 3.1e-09
Con un livello di significatività (\(\alpha\)) di 0.01 e un p-value molto piccolo (3.1e-09) ottenuto dal test di normalità di Anderson-Darling per i dati della variabile df$reb, si puo concludere che si hanno sufficienti evidenze statistiche per respingere lipotesi nulla che i dati seguano una distribuzione normale. Con il livello di significatività del 0.01 e il p-value molto piccolo (3.1e-09), il p-value è inferiore al livello di significatività, quindi si respinge lipotesi nulla. Questo suggerisce che i dati nella variabile df$reb non seguono una distribuzione normale al livello di significatività del 0.01. In termini più pratici, si hanno abbastanza evidenze statistice per concludere che la variabile df$reb non segue una distribuzione normale.
Il test Kolmogorov-Smirnov (K-S) è un metodo non parametrico
utilizzato per determinare se un campione di dati segue una specifica
distribuzione, in questo caso, la distribuzione normale. È ampiamente
impiegato per la sua generalità e la facilità di implementazione.
- Range: 0 a 1
- Interpretazione: Valori più bassi indicano una
maggiore somiglianza alla distribuzione normale. Un valore di test
significativamente grande porta al rifiuto dell’ipotesi di
normalità.
# Test di Kolmogorov-Smirnov per confrontare la distribuzione di 'reb' con una distribuzione normale
ks.test(df$reb, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: df$reb
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Il test KS confronta la distribuzione empirica dei dati con una distribuzione teorica (spesso una distribuzione uniforme). In breve, il risultato suggerisce che i nostri dati non seguono la distribuzione teorica normale presunta, e cè un elevata probabilità che la differenza osservata sia statisticamente significativa.
Il test Shapiro-Wilk è un metodo statistico non parametrico
utilizzato specificatamente per testare la normalità di un campione di
dati. È noto per la sua affidabilità e precisione, soprattutto in
campioni di dimensioni ridotte.
- Range: 0 a 1
- Interpretazione: Valori più vicini a 1 suggeriscono
una maggiore aderenza alla distribuzione normale. Valori
significativamente bassi indicano la deviazione dalla normalità.
# Test di Shapiro-Wilk per la normalità dei dati nella variabile 'reb' (rimbalzi)
sf.test(df$reb)
##
## Shapiro-Francia normality test
##
## data: df$reb
## W = 0.98016, p-value = 1.758e-08
In sintesi, il risultato del test di Shapiro-Francia indica che i dati nella variabile df$reb non seguono una distribuzione normale. Questo è supportato dal valore basso del p-value, il quale suggerisce che la differenza tra la distribuzione dei dati e una distribuzione normale è statisticamente significativa.
Abbiamo creato un modello lineare per esplorare come i rimbalzi influenzano le vittorie in NBA. L’idea è semplice: capire se squadre che rimbalzano meglio vincono di più. Il modello analizza diversi tipi di rimbalzi (offensivi, difensivi) e come questi si traducono in successo sul campo.
Le formule che usiamo si concentrano su diversi aspetti dei rimbalzi, come recuperare la palla dopo un tiro sbagliato o proteggere il canestro. Ogni formula ci dà un’idea di come le squadre gestiscono e sfruttano i rimbalzi durante le partite. L’obiettivo è vedere quale impatto hanno questi fattori sulle vittorie.
\(\text{Formula1} = \frac{\text{Rimbalzi offensivi in attacco}}{\text{Tiri sbagliati su azione}}\)
\(\text{Formula2} = \frac{\text{Rimbalzi difensivi in difesa presi}}{\text{Tiri sbagliati su azione degli avversari}}\)
\(\text{Formula3} = \frac{\text{Palle riprese in attacco} + 1.5 \times \text{Palle riprese in difesa}}{\text{Palle perse in attacco} + 2 \times \text{Rimbalzi subiti in difesa}}\)
\(\text{Formula4} = (\text{Palle riprese in attacco - Palle perse in attacco}) + 1.5*(\text{Palle riprese in difesa - Palle perse in difesa})\)
\(\text{Formula5} = \frac{(\frac{\text{Rimbalzi subiti in difesa}}{\text{Palle perse in difesa}})}{(\frac{\text{Rimbalzi subiti in attacco}}{\text{Palle perse in attacco}})}\)
\(\text{Formula6} = (\text{Rimbalzi ottenuti in attacco} + \text{Rimbalzi ottenuti in difesa}) - (\text{Rimbalzi subiti in difesa} - \text{Rimbalzi subiti in attacco})^2\)
\(\text{Formula7} = (\text{Efficienza nel Rimbalzo Offensivo} + \text{Competenza nel Rimbalzo Difensivo})^2\)
\(\text{Formula8} = \frac{\text{Rimbalzi ottenuti in attacco}}{\text{Totale rimbalzi in attacco}}\)
\(\text{Formula9} = \left(\frac{\text{Rimbalzi ottenuti in attacco}}{\text{Rimbalzi subiti in attacco}}\right)^2\)
\(\text{Formula10} = \left(\frac{\text{Rimbalzi ottenuti in difesa}}{\text{Rimbalzi subiti in difesa}}\right)^2\)
# Definizione di nuove variabili
df$f1 <- (df$o_oreb) / (df$o_fga - df$o_fgm)
df$f2 <- (df$d_dreb) / (df$d_fga - df$d_fgm)
df$f3 <- (df$o_oreb + 1.5 * df$d_dreb) / (df$o_dreb + 2 * df$d_oreb)
df$f4 <- (df$o_oreb - df$o_dreb) + 1.5 * (df$d_dreb - df$d_oreb)
df$f5 <- (df$d_oreb / df$d_to) / (df$o_dreb / df$o_to)
df$f6 <- (df$o_oreb + df$d_dreb) - (df$d_oreb - df$o_dreb)^2
df$f7 <- (df$f1 + df$f2)^2
df$f8 <- (df$o_oreb) / (df$o_reb)
df$f9 <- ((df$o_oreb) / (df$o_dreb))^2
df$f10 <- ((df$d_dreb) / (df$d_oreb))^2
Si esegue la divisione del dataframe df in un set di addestramento (train) e un set di test (test). La divisione è effettuata campionando casualmente il 70% delle righe per l’addestramento e utilizzando il restante 30% per il test. Successivamente, viene creato il modello lineare utilizzando le variabili predittive sopra create per prevedere la variabile di risposta won nel set di addestramento.
# Divisione in Test e Train per evitare che il modello fitti troppo bene sui nostri dati
sample <- sample(c(TRUE, FALSE), nrow(df), replace=TRUE, prob=c(0.7, 0.3))
df = subset(df, select = c("f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "won", "divID", "confID"))
train <- df[sample, ]
test <- df[!sample, ]
#ATTENZIONE: facendo il train sul valore delle variabili, questo significa che sono esse ad essere i nostri dati, non i rimbalzi in se.
# Creazione del modello lineare
linMod <- lm(won ~ f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10, data = train)
summary(linMod)
##
## Call:
## lm(formula = won ~ f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 +
## f10, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.491 -3.271 -0.106 3.029 14.654
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.993e+02 8.752e+01 11.418 < 2e-16 ***
## f1 -6.886e+02 1.513e+02 -4.551 6.47e-06 ***
## f2 -1.026e+03 1.590e+02 -6.453 2.28e-10 ***
## f3 -3.799e+02 3.504e+01 -10.844 < 2e-16 ***
## f4 6.800e-02 7.980e-03 8.522 < 2e-16 ***
## f5 -1.853e+02 4.929e+00 -37.593 < 2e-16 ***
## f6 1.047e-05 1.531e-06 6.836 2.03e-11 ***
## f7 4.532e+02 7.958e+01 5.695 1.95e-08 ***
## f8 -2.378e+02 7.474e+01 -3.182 0.00154 **
## f9 4.711e+01 2.219e+01 2.123 0.03419 *
## f10 3.813e+00 9.137e-01 4.174 3.45e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.739 on 592 degrees of freedom
## Multiple R-squared: 0.8555, Adjusted R-squared: 0.8531
## F-statistic: 350.5 on 10 and 592 DF, p-value: < 2.2e-16
La normalizzazione dei dati rappresenta un passaggio cruciale nell’ambito dell’elaborazione di modelli statistici, in particolare nei contesti che impiegano modelli lineari. Questo procedimento ha l’obiettivo di uniformare le scale delle diverse variabili, facilitando così il loro confronto reciproco e incrementando l’efficacia dell’algoritmo di regressione lineare. La normalizzazione assume un’importanza particolare in situazioni dove le variabili presentano scale eterogenee; in assenza di normalizzazione, infatti, la variazione nelle scale può compromettere significativamente la precisione del modello.
Nel seguente frammento di codice abbiamo eseguito la normalizzazione
delle variabili all’interno dei nostri dataframe ‘train’ e ‘test’,
facendo ricorso alla funzione scale. Ciò garantisce che
ogni variabile apporti un contributo proporzionato all’interno del
modello, consentendo un’interpretazione più precisa e accurata dei
coefficienti derivanti dalla regressione lineare.
# Normalizziamo le covariate
train$f1_z <- scale(train$f1)
train$f2_z <- scale(train$f2)
train$f3_z <- scale(train$f3)
train$f4_z <- scale(train$f4)
train$f5_z <- scale(train$f5)
train$f6_z <- scale(train$f6)
train$f7_z <- scale(train$f7)
train$f8_z <- scale(train$f8)
train$f9_z <- scale(train$f9)
train$f10_z <- scale(train$f10)
# Normalizzo i dati di test
test$f1_z <- scale(test$f1)
test$f2_z <- scale(test$f2)
test$f3_z <- scale(test$f3)
test$f4_z <- scale(test$f4)
test$f5_z <- scale(test$f5)
test$f6_z <- scale(test$f6)
test$f7_z <- scale(test$f7)
test$f8_z <- scale(test$f8)
test$f9_z <- scale(test$f9)
test$f10_z <- scale(test$f10)
linModNormalized <- lm(won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + f7_z + f8_z + f9_z + f10_z, data = train)
I seguenti quattro grafici costituiscono un’esplorazione diagnostica del modello di regressione lineare applicato per analizzare la correlazione tra i rimbalzi (sia offensivi che difensivi) e le vittorie di una squadra di basket.
Il primo grafico, denominato “Residui Standardizzati vs Valori Adattati”, mette in luce la relazione tra i residui del modello e i valori predetti. La distribuzione casuale dei punti attorno all’asse orizzontale è un indicatore della qualità dell’adattamento del modello. La linea rossa tratteggiata offre un riferimento per identificare eventuali pattern sistematici nei residui che potrebbero suggerire non linearità, eteroscedasticità o punti influenti.
Il secondo grafico è un “Q-Q Plot dei Residui Standardizzati”, che confronta la distribuzione dei residui del modello con quella che ci si aspetterebbe da una distribuzione normale. Questo tipo di grafico è cruciale per valutare l’assunzione della normalità dei residui, un presupposto fondamentale della regressione lineare. I punti seguono la linea diagonale rappresentativa della distribuzione normale teorica, e le deviazioni da questa linea possono indicare deviazioni dalla normalità.
Il terzo grafico, “Scale-Location” (o Spread-Location Plot), è utilizzato per verificare l’assunzione di omoscedasticità, ovvero la costanza della varianza dei residui attraverso il range dei valori predetti dal modello. Una dispersione uniforme dei punti lungo l’asse orizzontale suggerisce che la varianza dei residui è costante. Variazioni significative da questa uniformità possono indicare eteroscedasticità, che è una violazione di un’altra assunzione fondamentale della regressione lineare.
Il quarto grafico presenta il “Q-Q Plot dei Residui” con la distanza di Cook, che è una misura dell’influenza di ogni osservazione sui parametri stimati del modello. Valori elevati della distanza di Cook possono indicare punti con un’influenza sproporzionata, che potrebbero essere considerati outlier o punti di leva che meritano un’ulteriore indagine.
Ecco cosa possiamo dedurre da questi grafici:
L’analisi del primo grafico rivela una disposizione abbastanza casuale dei residui attorno allo zero, suggerendo che il modello non presenta errori sistematici nella predizione. Tuttavia, la presenza di alcuni punti distanti dalla massa centrale potrebbe indicare la presenza di outliers o di punti con pattern di varianza non catturati dal modello.
Il secondo grafico, il Q-Q plot, mostra una generale aderenza alla linea teorica, con alcune deviazioni evidenti nelle code. Queste deviazioni possono suggerire la presenza di outliers o che la distribuzione dei residui è leggermente asimmetrica, questioni che richiedono un’attenta valutazione.
Nel terzo grafico, che rappresenta la distribuzione dei residui, si osserva che i punti si allineano lungo una linea retta, indicando una distribuzione uniforme della varianza dei residui rispetto ai valori predetti. Questo è un segno di omoscedasticità, ovvero una condizione ideale in cui la varianza dei residui rimane costante attraverso l’intero intervallo dei valori predetti, suggerendo che il modello sta funzionando efficacemente senza la necessità di trasformazioni aggiuntive dei dati o l’impiego di modelli più complessi per gestire varianze non uniformi.
Il quarto grafico mostra che la maggior parte delle osservazioni ha una distanza di Cook bassa, il che implica un impatto minimo sulla stima dei parametri del modello. Tuttavia, ci sono alcuni punti che superano la soglia suggerita, indicati con i numeri di osservazione, che potrebbero essere esaminati più a fondo per comprendere la loro potenziale influenza sulle previsioni del modello.
Il processo di test di un modello lineare è cruciale per assicurare la sua affidabilità e accuratezza. Questa fase prevede la valutazione di vari aspetti del modello, come l’adattamento dei dati, la normalità dei residui, l’omoschedasticità e la multicollinearità. Ognuno di questi test fornisce un’indicazione su come il modello si adatta ai dati e su eventuali problemi che potrebbero influenzarne le prestazioni.
Per una comprensione immediata del modello, è utile visualizzare il
riepilogo tramite summary(linModNormalized). Questo
fornisce dettagli sui coefficienti, la significatività statistica e
altre metriche chiave.
summary (linModNormalized)
##
## Call:
## lm(formula = won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z +
## f7_z + f8_z + f9_z + f10_z, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.491 -3.271 -0.106 3.029 14.654
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.1526 0.1930 213.261 < 2e-16 ***
## f1_z -21.7591 4.7808 -4.551 6.47e-06 ***
## f2_z -48.7583 7.5559 -6.453 2.28e-10 ***
## f3_z -24.4977 2.2592 -10.844 < 2e-16 ***
## f4_z 18.1603 2.1310 8.522 < 2e-16 ***
## f5_z -12.6293 0.3359 -37.593 < 2e-16 ***
## f6_z 5.4273 0.7939 6.836 2.03e-11 ***
## f7_z 37.1938 6.5313 5.695 1.95e-08 ***
## f8_z -7.7117 2.4235 -3.182 0.00154 **
## f9_z 2.9272 1.3790 2.123 0.03419 *
## f10_z 5.5492 1.3296 4.174 3.45e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.739 on 592 degrees of freedom
## Multiple R-squared: 0.8555, Adjusted R-squared: 0.8531
## F-statistic: 350.5 on 10 and 592 DF, p-value: < 2.2e-16
Il test R-quadrato misura la proporzione della varianza totale della
variabile dipendente che viene spiegata dal modello di regressione. Un
R-quadrato elevato indica che una grande parte della varianza nella
variabile dipendente può essere spiegata dalle variabili indipendenti
nel modello.
- Range: 0 a 1
- Interpretazione: 0 indica nessuna spiegazione della
varianza da parte del modello. 1 indica una spiegazione completa della
varianza da parte del modello.
summary_linModNormalized <- summary(linModNormalized)
r_squared <- summary_linModNormalized$r.squared
cat("R-quadro:", r_squared, "\n")
## R-quadro: 0.8555179
Il R-quadrato adattato modifica il R-quadrato per tenere conto del
numero di predittori nel modello. È più affidabile per i modelli con
molteplici variabili indipendenti, poiché penalizza la complessità
aggiuntiva, fornendo una misura più realistica della bontà di
adattamento.
- Range: Può essere negativo, ma generalmente 0 a
1
- Interpretazione: Valori più vicini a 1 indicano una
migliore spiegazione della varianza, considerando il numero di
predittori.
n <- length(train$o_reb)
k <- length(linModNormalized$coefficients) - 1
adjusted_r_squared <- 1 - ((1 - r_squared) * (n - 1) / (n - k - 1))
cat("R-quadro adattato:", adjusted_r_squared, "\n")
## R-quadro adattato: 0.9868653
Il test di Shapiro-Wilk sui residui è utilizzato per valutare la
normalità dei residui in un modello di regressione lineare. La normalità
dei residui è un’assunzione critica in molti test statistici. Se i
residui non seguono una distribuzione normale, le inferenze sulle stime
dei parametri potrebbero essere invalide.
- Range: 0 a 1
- Interpretazione: Valori più vicini a 1 suggeriscono
una maggiore probabilità che i residui seguano una distribuzione
normale.
shapiro.test(residuals(linModNormalized))
##
## Shapiro-Wilk normality test
##
## data: residuals(linModNormalized)
## W = 0.99395, p-value = 0.01653
Il test di Breusch-Pagan verifica l’assunzione di omoschedasticità
(varianza costante) dei residui in un modello di regressione. La
presenza di eteroschedasticità (varianza non costante) nei residui può
portare a stime inefficaci e test statistici non affidabili.
- Range: 0 a \(+\infty\)
- Interpretazione: Valori più alti indicano una
maggiore probabilità di eteroschedasticità. Si confronta il valore del
test con un valore critico (ad es., da una distribuzione chi-quadrato)
per determinare la significatività.
bptest(linModNormalized)
##
## studentized Breusch-Pagan test
##
## data: linModNormalized
## BP = 17.914, df = 10, p-value = 0.05642
Il test di multicollinearità verifica se esiste una correlazione
elevata tra le variabili indipendenti in un modello di regressione
lineare. La multicollinearità può causare problemi nella stima dei
coefficienti del modello, rendendo difficili l’interpretazione e la
significatività statistica delle variabili indipendenti. Strumenti
comuni per rilevarla includono il fattore di inflazione della varianza
(VIF) e l’indice di tolleranza.
- Range del VIF: 1 a \(+\infty\)
- Interpretazione: 1 indica assenza di
multicollinearità. Valori superiori a 5 o 10 sono spesso considerati
indicatori di multicollinearità significativa.
car::vif(linModNormalized)
## f1_z f2_z f3_z f4_z f5_z f6_z
## 612.779281 1530.672009 136.841593 121.751246 3.025857 16.897658
## f7_z f8_z f9_z f10_z
## 1143.686151 157.473426 50.982354 47.399324
Nel perfezionare i modelli statistici, la gestione degli outliers è cruciale. Gli outliers possono distorcere significativamente i risultati e portare a stime dei parametri poco affidabili. La loro rimozione o adeguato trattamento è fondamentale per aumentare la precisione del modello. Tale processo non solo migliora la validità delle inferenze statistiche ma anche la capacità del modello di generalizzare a dati non osservati.
Parallelamente, tecniche di regolarizzazione come LASSO (Least Absolute Shrinkage and Selection Operator) si rivelano preziose. LASSO penalizza la grandezza assoluta dei coefficienti di regressione, con l’effetto diretto di ridurre il sovradimensionamento (overfitting) e favorire la selezione delle variabili. Attraverso la contrazione dei coefficienti verso zero, LASSO contribuisce a escludere predittori non informativi, affinando il modello sui fattori più rilevanti.
Incorporando LASSO, possiamo quindi affrontare due problematiche fondamentali: la riduzione della complessità del modello e l’incremento dell’interpretabilità dei dati. La rimozione degli outliers, combinata con l’approccio selettivo di LASSO, è una strategia potente per migliorare la robustezza e l’efficacia del nostro modello lineare, ottimizzando la correlazione tra i rimbalzi e le vittorie.
La prima fase nel perfezionamento del modello implica l’identificazione accurata degli outliers. Per questa operazione, adottiamo un grafico di influenza, uno strumento grafico che mette in evidenza le osservazioni che esercitano un’influenza eccessiva sulla stima dei parametri.
Questo tipo di grafico è utilizzato per valutare l’effetto che ogni osservazione ha sulla stima dei coefficienti del modello. Le dimensioni dei cerchi sono proporzionali alla distanza di Cook, una misura che combina la deviazione dei residui standardizzati (sull’asse verticale) e il leverage o hat-values (sull’asse orizzontale). Un valore di leverage alto indica che l’osservazione ha un grande impatto sulla forma del modello, mentre residui standardizzati grandi indicano deviazioni dai valori predetti. La combinazione di entrambi può segnalare punti potenzialmente influenti o outlier.
Esaminando il grafico, si notano alcune osservazioni con cerchi di dimensioni maggiori che hanno una distanza di Cook relativamente alta e quindi esercitano un’influenza maggiore sul modello rispetto ad altre osservazioni. Queste osservazioni dovrebbero essere esaminate attentamente, poiché la loro rimozione o la correzione dei dati sottostanti potrebbe significativamente alterare i coefficienti stimati nel modello di regressione.
Valutiamo i residui rispetto ai valori predetti e definiamo come outliers quegli osservazioni la cui deviazione dalla media supera un limite prefissato, che in questo contesto è stabilito a due deviazioni standard.
# Calcola i residui dal modello di regressione lineare normalizzato
residui <- residuals(linModNormalized)
# Definisci una soglia per gli outlier
soglia_outlier <- 2
outliers <- which(abs(residui) > soglia_outlier*sd(residui))
# Identifica gli outlier basati sulla soglia definita
outliers <- which(abs(residui) > soglia_outlier * sd(residui))
outliers
## 440 519 541 624 652 769 799 822 891 900 936 940 945 957 1026 1128
## 2 64 79 133 154 240 265 284 339 345 368 372 375 383 414 475
## 1196 1205 1224 1270 1306
## 522 525 538 573 601
Identificati gli outliers, procediamo con la loro esclusione dal dataset utilizzato per l’addestramento del modello. Tale rimozione mira a migliorare la robustezza e la generalizzabilità del modello.
# Rimuovi gli outliers e ricrea il modello lineare normalizzato
if (length(outliers) != 0) {
train_1 <- train[-outliers,]
} else {
train_1 <- train # questo è il caso in cui non siano presenti outliers
}
# ATTENZIONE: facendo il train sul valore delle variabili, questo significa
# che sono esse ad essere i nostri dati, non i rimbalzi in sé.
Il confronto tra i modelli prima e dopo l’eliminazione degli outliers è vitale per valutare l’efficacia di questo intervento. Analizziamo i riepiloghi statistici del modello per discernere le variazioni nelle performance.
Si esamina il sommario del modello originale per stabilire un benchmark delle prestazioni.
##
## Call:
## lm(formula = won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z +
## f7_z + f8_z + f9_z + f10_z, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.491 -3.271 -0.106 3.029 14.654
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.1526 0.1930 213.261 < 2e-16 ***
## f1_z -21.7591 4.7808 -4.551 6.47e-06 ***
## f2_z -48.7583 7.5559 -6.453 2.28e-10 ***
## f3_z -24.4977 2.2592 -10.844 < 2e-16 ***
## f4_z 18.1603 2.1310 8.522 < 2e-16 ***
## f5_z -12.6293 0.3359 -37.593 < 2e-16 ***
## f6_z 5.4273 0.7939 6.836 2.03e-11 ***
## f7_z 37.1938 6.5313 5.695 1.95e-08 ***
## f8_z -7.7117 2.4235 -3.182 0.00154 **
## f9_z 2.9272 1.3790 2.123 0.03419 *
## f10_z 5.5492 1.3296 4.174 3.45e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.739 on 592 degrees of freedom
## Multiple R-squared: 0.8555, Adjusted R-squared: 0.8531
## F-statistic: 350.5 on 10 and 592 DF, p-value: < 2.2e-16
Una volta esclusi gli outliers, ricostruiamo il modello e esaminiamo nuovamente il grafico di influenza per osservare come l’eliminazione abbia modificato l’impatto delle osservazioni sui parametri stimati.
##
## Call:
## lm(formula = won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z +
## f7_z + f8_z + f9_z + f10_z, data = train_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.2496 -3.0822 0.0408 3.0531 9.6969
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 40.9153 0.1780 229.845 < 2e-16 ***
## f1_z -17.4184 4.9825 -3.496 0.000509 ***
## f2_z -44.2029 7.8525 -5.629 2.84e-08 ***
## f3_z -26.6646 2.1243 -12.552 < 2e-16 ***
## f4_z 20.9004 2.0530 10.181 < 2e-16 ***
## f5_z -12.6785 0.3138 -40.405 < 2e-16 ***
## f6_z 6.2099 0.7555 8.219 1.38e-15 ***
## f7_z 32.1326 6.8336 4.702 3.23e-06 ***
## f8_z -9.7034 2.2426 -4.327 1.79e-05 ***
## f9_z 3.7510 1.2691 2.956 0.003248 **
## f10_z 6.4766 1.2286 5.271 1.92e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.29 on 571 degrees of freedom
## Multiple R-squared: 0.8792, Adjusted R-squared: 0.8771
## F-statistic: 415.6 on 10 and 571 DF, p-value: < 2.2e-16
La metodologia è identica a quella del primo grafico, ma le osservazioni qui rappresentate possono essere differenti a causa delle variazioni nei dati o nei coefficienti inclusi in questo secondo modello. Di nuovo, i cerchi più grandi rappresentano una maggiore distanza di Cook e quindi una maggiore influenza sull’adattamento del modello.
In questo grafico, si nota che alcune osservazioni continuano ad esercitare una certa influenza significativa sul modello di regressione. Tuttavia, una volta rimossi la maggior parte degli outliers, si osserva che molti più valori presentano una distanza di Cook minore o simile tra di loro, indicando una maggiore omogeneità nell’influenza esercitata dalle diverse osservazioni sul modello. Questo suggerisce che la rimozione degli outliers contribuisce a una maggiore stabilità e affidabilità del modello di regressione.
Questo blocco di codice utilizza la funzione
ols_plot_resid_lev per visualizzare la relazione tra i
residui e il leverage per entrambi i modelli lineari. I due grafici
rappresentano una comparativa diagnostica dei residui standardizzati
rispetto al leverage per due versioni di un modello di regressione
lineare: il primo prima della rimozione degli outliers e il secondo dopo
tale processo. Questi grafici sono strumenti essenziali per valutare la
presenza e l’impatto di outliers e punti ad alto leverage sulla stima
dei parametri del modello. La soglia di leverage è indicata da una linea
verticale rossa, e i punti sono colorati diversamente per indicare se
sono normali, outliers, punti ad alto leverage, o una combinazione di
queste caratteristiche.
Esaminando i due grafici, è evidente che il secondo modello presenta meno osservazioni con alto leverage, come dimostrato dalla riduzione dei punti che superano la soglia di leverage. Ciò suggerisce che la rimozione degli outliers ha avuto l’effetto desiderato di ridurre l’influenza di osservazioni atipiche e potenzialmente distorsive sul modello di regressione.
Il modello LASSO (Least Absolute Shrinkage and Selection Operator) viene utilizzato per migliorare la qualità predittiva e l’interpretabilità di modelli di regressione statistica attraverso la selezione di variabili e la regolarizzazione. Il suo impiego è particolarmente vantaggioso per affrontare problemi di overfitting e per identificare i predittori più rilevanti, consentendo al modello di mantenere robustezza e precisione anche su dati non inclusi nella fase di addestramento.
Per implementare il modello LASSO, seguiamo un processo meticoloso che inizia con la definizione chiara della variabile risposta e la selezione accurata delle variabili predittive. Procediamo quindi con una cross-validation k-fold, un metodo rigoroso per determinare il valore ottimale del parametro di regolarizzazione lambda, che equilibra complessità e capacità predittiva del modello.
# Impostazione del contesto per il metodo di regressione LASSO con cross-validation per selezionare il valore lambda più efficace.
# Definizione della variabile risposta
y <- train_1$won
# Creazione della matrice dei predittori, selezionando le features di interesse
x <- data.matrix(train_1[, c("f1_z", "f2_z", "f3_z", "f4_z", "f5_z", "f6_z", "f7_z", "f8_z", "f9_z", "f10_z")])
# Applicazione della cross-validation k-fold per identificare il lambda ottimale
cv_model <- cv.glmnet(x, y, alpha = 1)
# Estrazione del valore di lambda che minimizza il Mean Squared Error sul test set
best_lambda <- cv_model$lambda.min
Questo è il grafico di tutti i valori possibili di lambda.
## [1] "Lambda migliore: 0.0044"
Dopo aver individuato il valore di lambda che minimizza l’errore quadratico medio, procediamo all’addestramento del modello LASSO. Esaminiamo i coefficienti risultanti per valutare l’importanza assegnata a ciascuna variabile predittiva, offrendo così una visione quantitativa dell’impatto di ogni feature sulle vittorie della squadra.
# Fittiamo il modello con il miglior lambda (penalizzazione)
best_model <- glmnet(x, y, alpha = 1, lambda = best_lambda)
# Stampa i coefficienti del modello LASSO
coef(best_model)
## 11 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 40.892095
## f1_z .
## f2_z -15.379326
## f3_z -23.036699
## f4_z 16.799569
## f5_z -12.647935
## f6_z 4.985415
## f7_z 7.196146
## f8_z -10.078826
## f9_z 5.388384
## f10_z 4.448406
# Stampa il summary del modello lineare normalizzato precedente per confronto
summary(linModNormalized_1)
##
## Call:
## lm(formula = won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z +
## f7_z + f8_z + f9_z + f10_z, data = train_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.2496 -3.0822 0.0408 3.0531 9.6969
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 40.9153 0.1780 229.845 < 2e-16 ***
## f1_z -17.4184 4.9825 -3.496 0.000509 ***
## f2_z -44.2029 7.8525 -5.629 2.84e-08 ***
## f3_z -26.6646 2.1243 -12.552 < 2e-16 ***
## f4_z 20.9004 2.0530 10.181 < 2e-16 ***
## f5_z -12.6785 0.3138 -40.405 < 2e-16 ***
## f6_z 6.2099 0.7555 8.219 1.38e-15 ***
## f7_z 32.1326 6.8336 4.702 3.23e-06 ***
## f8_z -9.7034 2.2426 -4.327 1.79e-05 ***
## f9_z 3.7510 1.2691 2.956 0.003248 **
## f10_z 6.4766 1.2286 5.271 1.92e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.29 on 571 degrees of freedom
## Multiple R-squared: 0.8792, Adjusted R-squared: 0.8771
## F-statistic: 415.6 on 10 and 571 DF, p-value: < 2.2e-16
Il confronto delle previsioni generate dal modello LASSO e da un modello lineare classico ci permette di valutare l’efficacia di ciascun approccio nel contesto specifico dei nostri dati. Utilizziamo i dati di test per misurare la precisione predittiva e confrontiamo le metriche chiave come l’errore quadratico medio (RMSE) e le performance di classificazione.
# Questo codice esegue stime usando un modello Lasso e un modello lineare (LM) su un set di dati di test e ne valuta le prestazioni utilizzando l'errore quadratico medio (RMSE) e le metriche di classificazione binaria, ad esempio matrice di confusione, accuratezza, precisione, sensibilità, punteggio F e specificità.
# Predizioni utilizzando il modello Lasso
new <- data.matrix(test[, c("f1_z", "f2_z", "f3_z", "f4_z", "f5_z", "f6_z", "f7_z", "f8_z", "f9_z", "f10_z")])
prevLasso <- predict(best_model, s = best_lambda, newx = new)
# Predizioni utilizzando il modello LM (Linear Model)
new <- subset(test, select = c("f1_z", "f2_z", "f3_z", "f4_z", "f5_z", "f6_z", "f7_z", "f8_z", "f9_z", "f10_z"))
prevLM <- predict(linModNormalized_1, newdata = new)
Confrontiamo le prestazioni di entrambi i modelli (LASSO e lineare) attraverso diverse metriche.
# Calcolo dell'Errore Quadratico Medio (RMSE) per il modello Lasso
rmsLasso <- sqrt(mean((test$won - prevLasso)^2))
# Calcolo dell'Errore Quadratico Medio (RMSE) per il modello LM (Linear Model)
rmsLM <- sqrt(mean((test$won - prevLM)^2))
# Classificazione binaria utilizzando una soglia (0.5) per le predizioni del modello Lasso
prev <- ifelse(prevLasso > 0.5, "1", "0")
prev <- as.factor(prev)
# Matrice di Confusione per le predizioni del modello Lasso
confMatrix <- table(prev, test$won)
Calcoliamo diverse metriche di valutazione come l’accuratezza (accuracy), la precisione (precision), la sensibilità (sensitivity), l’F-score e la specificità (specificity). Queste metriche forniscono una valutazione complessiva dell’efficacia del modello.
Ecco come interpretarle:
# Metriche di Performance
accuracy <- sum(confMatrix[1], confMatrix[4]) / sum(confMatrix[1:4])
precision <- confMatrix[4] / sum(confMatrix[4], confMatrix[2])
sensitivity <- confMatrix[4] / sum(confMatrix[4], confMatrix[3])
fscore <- (2 * (sensitivity * precision)) / (sensitivity + precision)
specificity <- confMatrix[1] / sum(confMatrix[1], confMatrix[2])
# Gli RMSE rispettivamente del modello normalizato e del LASSO li abbiamo calcolati sopra
## Accuratezza: 66.6667%
## Precisione: 75%
## Sensibilità: 75%
## F-Score: 75%
## Specificità: 50%
## RMS Lasso: 4.6176
## RMS Modello Lineare: 4.5909
Confrontando i risultati ottenuti dai due modelli, possiamo apprezzare l’efficacia del LASSO nell’affrontare la complessità e il potenziale overfitting. La selezione di variabili intrinseca al LASSO si rivela particolarmente utile quando il numero di predittori è elevato rispetto al numero di osservazioni. Questo approccio non solo semplifica il modello, riducendo i predittori ai soli fattori significativi, ma migliora anche la chiarezza interpretativa dei risultati, un aspetto fondamentale nella comunicazione delle scoperte a un pubblico più ampio.
In sintesi, il modello LASSO offre un equilibrio ottimale tra complessità del modello e capacità predittiva, rendendolo uno strumento prezioso nella nostra analisi statistica.
L’analisi della varianza (ANOVA) è un metodo statistico utilizzato per testare le differenze tra le medie di diverse categorie e può essere particolarmente utile per valutare l’impatto di variabili categoriche su una variabile di risposta continua. In questo segmento del report, eseguiamo il test ANOVA per determinare l’efficacia di due variabili categoriche, ‘confID’ e ‘divID’, come predittori delle vittorie.
Per iniziare, esploriamo l’influenza della variabile ‘confID’, che rappresenta la conferenza a cui appartiene una squadra, sulla variabile dipendente ‘won’, che indica il numero di vittorie.
# Esecuzione del test ANOVA per esaminare l'impatto della variabile 'confID'
resp_conf <- anova(lm(won ~ confID, data = train_1))
# Stampa dei risultati con interpretazione condizionale
if (resp_conf["confID", "Pr(>F)"] < 0.05) {
print("L'ipotesi nulla è respinta: la variabile 'confID' ha un effetto significativo sulle vittorie.")
} else {
print("L'ipotesi nulla è accettata: non si rileva un effetto significativo della variabile 'confID' sulle vittorie.")
}
## [1] "L'ipotesi nulla è accettata: non si rileva un effetto significativo della variabile 'confID' sulle vittorie."
Successivamente, esaminiamo il potenziale impatto della variabile ‘divID’, che designa la divisione di una squadra, sempre sulla variabile ‘won’.
# Esecuzione del test ANOVA per valutare l'impatto della variabile 'divID'
resp_div <- anova(lm(won ~ divID, data = train_1))
# Decisione basata sui risultati del test e impostazione della variabile logica
if (resp_div["divID", "Pr(>F)"] < 0.05) {
print("L'ipotesi nulla è respinta: la variabile 'divID' ha un effetto significativo sulle vittorie.")
div <- TRUE
} else {
print("L'ipotesi nulla è accettata: non emerge un effetto significativo della variabile 'divID' sulle vittorie.")
div <- FALSE
}
## [1] "L'ipotesi nulla è accettata: non emerge un effetto significativo della variabile 'divID' sulle vittorie."
Nella modellizzazione statistica, gli effetti di interazione tra variabili possono rivelare dinamiche complesse e influenze reciproche che non sono apprezzabili quando le variabili sono considerate isolatamente. Questa sezione è dedicata alla costruzione di un modello lineare che incorpora tali effetti di interazione, permettendo di comprendere meglio come le combinazioni di fattori influenzino il numero di vittorie.
La decisione di includere gli effetti di interazione nel modello
dipende dall’analisi preliminare svolta sulla variabile
div. Se div si rivela significativa, la
includeremo nel modello; in caso contrario, la escluderemo.
# Verifica del valore di 'div' per costruire il modello appropriato
if (div) {
linModNormalized_2 <- lm(won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + f7_z + f8_z + f9_z + f10_z + divID + f1_z:f2_z + f4_z:divID, data = train_1)
} else {
linModNormalized_2 <- lm(won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + f7_z + f8_z + f9_z + f10_z + f1_z:f2_z + f4_z:divID, data = train_1)
}
# Estrazione del riassunto del modello
riassunto <- summary(linModNormalized_2)
Una volta costruito il modello, procediamo all’identificazione delle interazioni significative. Utilizziamo i p-value per determinare quali effetti di interazione meritano di essere inclusi nel modello. Nel caso di questa analisi abbiamo verificato la significativita’ delle interazioni ‘f4_z:divID’ e ‘f1_z:f2_z’, in quanto vogliamo analizzare se l’efficienza netta dei rimbalzi (Formula 4) ha un’ interazione con la divisione, e se l’efficienza nel rimbalzo offensivo (Formula 1) ha un’ interazione con la capacita’ della squadra nel recuperare rimbalzi difensivi (Formula 2).
# Estrazione dei nomi delle righe dal riassunto del modello
nomi_righe <- rownames(riassunto$coefficients)
# Nomi delle righe da escludere
nomi_da_escludere <- c("(Intercept)", "f1_z:f2_z", "f4_z:divIDCD", "f4_z:divIDMW", "f4_z:divIDNW", "f4_z:divIDPC", "f4_z:divIDSE", "f4_z:divIDSW", "divIDCD", "divIDMW", "divIDNW", "divIDPC", "divIDSE", "divIDSW")
# Creazione di un vettore con i nomi delle righe da utilizzare
nomi_righe_da_utilizzare <- setdiff(nomi_righe, nomi_da_escludere)
# divID' viene aggiunto a modello solo se e' stata riscontrata influenza significativa durante il test anova, ma non significa che sara significativo anche nel nuovo modello.
if ("divIDCD" %in% nomi_righe) {
nomi_righe_da_utilizzare <- append(nomi_righe_da_utilizzare, c("divID"))
}
# Indici di inizio e fine per le p-values della variabile 'divID'
div_indice_inizio <- which(rownames(riassunto$coefficients) == "f4_z:divIDCD")
div_indice_fine <- which(rownames(riassunto$coefficients) == "f4_z:divIDSW")
# Estrazione delle p-values della variabile 'divID'
div_p_values <- riassunto$coefficients[div_indice_inizio:div_indice_fine, "Pr(>|t|)"]
# Aggiunta di 'f4_z:divID' se la media delle p-values è inferiore a 0.05
if (mean(div_p_values) < 0.05) {
variabili <- append(nomi_righe_da_utilizzare, c("f4_z:divID"))
}
# Aggiunta di 'f1_z:f2_z' se la sua p-value è inferiore a 0.05
if (riassunto$coefficients["f1_z:f2_z", "Pr(>|t|)"] < 0.05) {
variabili <- append(nomi_righe_da_utilizzare, c("f1_z:f2_z"))
}
# Se nessuna delle condizioni precedenti è soddisfatta, utilizza solo le variabili esistenti
if (!(mean(div_p_values) < 0.05) && !(riassunto$coefficients["f1_z:f2_z", "Pr(>|t|)"] < 0.05)) {
variabili <- nomi_righe_da_utilizzare
}
# Creazione della formula significativa per il modello
formula_significativa <- as.formula(paste("won ~", paste(variabili, collapse = " + ")))
L’analisi dettagliata degli effetti di interazione ci permette di affinare il modello lineare, migliorando la nostra comprensione di come le variabili interagiscono tra loro e il loro impatto collettivo sulle vittorie. La selezione attenta di queste interazioni è fondamentale, poiché modella la realtà di come i fattori di gioco si influenzano reciprocamente in maniere non sempre intuitivamente prevedibili.
Dopo aver selezionato gli effetti di interazione rilevanti, rifiniamo il modello includendo solo quelle interazioni che hanno dimostrato una significatività statistica, portando a un modello più snello e potenzialmente più potente.
# Costruzione del nuovo modello lineare con la formula significativa
linModNormalized_2 <- lm(formula_significativa, data = train_1)
# Visualizzazione del riassunto del nuovo modello
summary(linModNormalized_2)
##
## Call:
## lm(formula = formula_significativa, data = train_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.2496 -3.0822 0.0408 3.0531 9.6969
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 40.9153 0.1780 229.845 < 2e-16 ***
## f1_z -17.4184 4.9825 -3.496 0.000509 ***
## f2_z -44.2029 7.8525 -5.629 2.84e-08 ***
## f3_z -26.6646 2.1243 -12.552 < 2e-16 ***
## f4_z 20.9004 2.0530 10.181 < 2e-16 ***
## f5_z -12.6785 0.3138 -40.405 < 2e-16 ***
## f6_z 6.2099 0.7555 8.219 1.38e-15 ***
## f7_z 32.1326 6.8336 4.702 3.23e-06 ***
## f8_z -9.7034 2.2426 -4.327 1.79e-05 ***
## f9_z 3.7510 1.2691 2.956 0.003248 **
## f10_z 6.4766 1.2286 5.271 1.92e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.29 on 571 degrees of freedom
## Multiple R-squared: 0.8792, Adjusted R-squared: 0.8771
## F-statistic: 415.6 on 10 and 571 DF, p-value: < 2.2e-16
# Calcolare il summary del modello lineare
summary_linModNormalized_2 <- summary(linModNormalized_2)
# Ottenere il coefficiente di determinazione R-quadrato
r_squared_LM_2 <- summary_linModNormalized_2$r.squared
cat("R-quadrato LM_2:", r_squared_LM_2, "\n")
## R-quadrato LM_2: 0.8792006
# Calcolare l'R-quadrato adattato
# (dove n è il numero di osservazioni e k è il numero di parametri nel modello)
n <- length(linModNormalized_2$residuals) # Numero di osservazioni
k <- length(linModNormalized_2$coefficients) - 1 # Numero di parametri nel modello
adjusted_r_squared_LM_2 <- 1 - ((1 - r_squared_LM_2) * (n - 1) / (n - k - 1))
cat("R-quadrato adattato LM_2:", adjusted_r_squared_LM_2, "\n")
## R-quadrato adattato LM_2: 0.877085
Nell’ambito degli studi statistici, la regressione di Poisson può offrire una prospettiva alternativa e talvolta più adeguata per la modellazione di variabili di conteggio, come il numero di vittorie in un contesto sportivo. Pertanto, esploriamo la possibilità di utilizzare un modello di regressione generalizzata di Poisson per confrontare la sua efficacia con quella del modello lineare già sviluppato.
Il modello di Poisson è particolarmente adatto per dati che descrivono il conteggio di eventi che si verificano in uno spazio o in un intervallo di tempo definiti. In questo caso, il numero di vittorie può essere adatto per tale modellizzazione, presupponendo che i dati si conformino alla distribuzione di Poisson.
# Questo codice addestra un modello di regressione generalizzata di Poisson (linModNormalized2_pois) utilizzando la stessa specifica del modello lineare (linModNormalized2). Successivamente, vengono ottenuti e combinati i coefficienti di entrambi i modelli in un unico dataframe per una facile comparazione.
# Creazioni di un modello di regressione generalizzata di Poisson
linModNormalized_2_pois = glm(formula_significativa, family=poisson(link=log), data = train_1)
summary(linModNormalized_2_pois)
##
## Call:
## glm(formula = formula_significativa, family = poisson(link = log),
## data = train_1)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.669237 0.006778 541.367 < 2e-16 ***
## f1_z -0.043990 0.186548 -0.236 0.813579
## f2_z -0.549143 0.294418 -1.865 0.062155 .
## f3_z -0.746783 0.079595 -9.382 < 2e-16 ***
## f4_z 0.605874 0.077243 7.844 4.37e-15 ***
## f5_z -0.326695 0.011844 -27.584 < 2e-16 ***
## f6_z 0.153027 0.026713 5.729 1.01e-08 ***
## f7_z 0.295581 0.258278 1.144 0.252446
## f8_z -0.290636 0.081219 -3.578 0.000346 ***
## f9_z 0.120785 0.046905 2.575 0.010021 *
## f10_z 0.165618 0.043735 3.787 0.000153 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2251.43 on 581 degrees of freedom
## Residual deviance: 335.08 on 571 degrees of freedom
## AIC: 3560
##
## Number of Fisher Scoring iterations: 4
Per un’analisi comparativa, estraiamo i coefficienti dai modelli lineare e di Poisson. È importante notare che i coefficienti del modello di Poisson vengono esponenziati per facilitarne l’interpretazione nel contesto del modello log-lineare.
# Ottenimento dei coefficienti per ambo i modelli
normal = coefficients(linModNormalized_2)
poisson = exp(coefficients(linModNormalized_2_pois))
# Combinazione dei coefficienti in un unico dataframe
coefficients_table <- cbind(normal, poisson)
coefficients_table
## normal poisson
## (Intercept) 40.915347 39.2219804
## f1_z -17.418377 0.9569633
## f2_z -44.202870 0.5774442
## f3_z -26.664603 0.4738888
## f4_z 20.900438 1.8328539
## f5_z -12.678503 0.7213038
## f6_z 6.209859 1.1653564
## f7_z 32.132550 1.3439070
## f8_z -9.703416 0.7477879
## f9_z 3.750981 1.1283823
## f10_z 6.476603 1.1801223
È importante notare che gli effetti delle variabili possono essere interpretati in modo diverso a seconda della distribuzione scelta per il modello. La scelta tra distribuzione normale e di Poisson dipende dalla natura della variabile dipendente e dagli obiettivi di modellazione. Nel contesto di modelli di regressione, è sempre buona pratica verificare l’adeguatezza del modello esaminando i residui, eseguendo test diagnostici e valutando la bontà di adattamento. L’interpretazione dei coefficienti dovrebbe essere fatta considerando la scala appropriata per la distribuzione utilizzata (lineare per la normale, logaritmica per la Poisson). Dato che stiamo cercando di prevedere il numero di vittorie, la distribuzione di Poisson potrebbe essere più appropriata per variabili conteggio come questa. Tuttavia, è sempre necessario verificare l’adeguatezza del modello ai dati specifici.
La valutazione della qualità dei due modelli statistici, il modello lineare e quello di Poisson, può essere effettuata attraverso il Criterio di Informazione di Akaike (AIC). L’AIC è una metrica statistica volta a bilanciare la bontà di adattamento di un modello ai dati con la sua complessità. L’obiettivo è selezionare il modello che offre le migliori previsioni con la minima complessità. Generalmente, un valore di AIC più basso indica un modello preferibile.
Un punteggio AIC più basso indica generalmente un modello più preferibile, poiché suggerisce un equilibrio ottimale tra un buon adattamento ai dati e una minore complessità del modello. Non esiste un “range” specifico che definisca un buon valore AIC in termini assoluti, poiché il suo valore dipende dalla scala dei dati e dalla natura del modello. Una differenza di 2 o più punti AIC è spesso considerata sostanziale, indicando una preferenza significativa per il modello con il valore AIC inferiore.
# Calcola il criterio di informazione di Akaike (AIC) per il modello lineare
aic_2 <- AIC(linModNormalized_2)
# Calcola il criterio di informazione di Akaike (AIC) per il modello di Poisson
aic_2_pois <- AIC(linModNormalized_2_pois)
## AIC per il modello lineare (linModNormalized_2): 3359.641
## AIC per il modello di Poisson (linModNormalized_2_pois): 3560.018
La comparazione dei valori di AIC ci consente di determinare quale modello sia più efficace. In questo caso specifico, il modello lineare (linModNormalized_2) presenta un valore AIC inferiore rispetto al modello di Poisson (linModNormalized_2_pois), indicando una migliore performance in termini di equilibrio tra adattamento ai dati e complessità del modello. La discrepanza tra i valori AIC dei due modelli fornisce ulteriori indicazioni sull’efficacia relativa del modello lineare rispetto a quello di Poisson.
Nel corso di questo studio sull’influenza dei rimbalzi rispetto alle vittorie nel campionato di basket NBA, abbiamo implementato e confrontato diversi modelli statistici. Inizialmente, i processi di normalizzazione e la rimozione degli outliers hanno portato alla creazione di un modello lineare iniziale, seguito da un modello Lasso basato sui dati di training. Il modello Lasso ha dimostrato una maggiore efficacia, incoraggiando il suo utilizzo come modello preferito.
Successivamente, attraverso un’analisi delle variabili, abbiamo identificato il modello finale linModNormalized_2, che include interazioni significative tra le variabili e tiene conto dell’impatto della Divisione sulle vittorie. Questo modello ha mostrato un notevole miglioramento delle metriche di adattamento rispetto al modello iniziale, evidenziando la sua robustezza nell’esplorare le relazioni sottostanti nei dati.
Inoltre, l’analisi delle metriche di adattamento del modello lineare finale linModNormalized_2 ha confermato la sua efficacia, con valori più elevati di R2 e R2-adattato rispetto al modello iniziale basato solo sui dati di training (senza outliers). Questi risultati supportano la scelta del modello linModNormalized_2 come modello preferito per spiegare la variazione nei dati.
Infine, il confronto dei modelli è stato esteso all’analisi della differenza tra un modello lineare e un modello di Poisson attraverso il criterio di informazione di Akaike (AIC). I risultati dell’AIC hanno indicato che il modello lineare (linModNormalized_2) è preferibile al modello di Poisson (linModNormalized_2_pois), suggerendo che il primo si adatti meglio alla variabilità delle vittorie in relazione ai rimbalzi.
In conclusione, il processo analitico ha permesso di identificare e validare un modello lineare finale che si adatta bene ai dati e offre una migliore comprensione della relazione tra rimbalzi e vittorie nel contesto del campionato NBA.
Riassumendo quindi i risultati che abbiamo ottenuto possiamo evidenziare 3 punti fondamentali del nostro studio:
Importanza dei Rimbalzi nel Basket: Il modello lineare ha dimostrato che esiste una correlazione positiva tra il numero di rimbalzi e le vittorie delle squadre. Ciò suggerisce che le squadre che eccellono nel rimbalzo tendono a ottenere migliori prestazioni in termini di vittorie. Questo risultato sottolinea l’importanza strategica dei rimbalzi nel gioco del basket, incoraggiando le squadre a focalizzarsi su questa area durante gli allenamenti e le strategie di gioco.
Effetti dei Rimbalzi Offensivi e Difensivi: Analizzando separatamente i rimbalzi offensivi e difensivi, il modello ha rivelato che entrambi contribuiscono significativamente alle prestazioni della squadra, sebbene in misura diversa. I rimbalzi difensivi sembrano avere un impatto leggermente maggiore sulle vittorie rispetto a quelli offensivi. Questo può guidare gli allenatori a enfatizzare la difesa del canestro e il controllo del tabellone difensivo come elementi chiave per il successo della squadra.
Strategie di Gioco e Formazione della Squadra: Questi risultati possono influenzare le decisioni relative alla formazione della squadra e alle strategie di gioco. Ad esempio, squadre con un basso numero di rimbalzi potrebbero considerare l’introduzione di giocatori più forti nel rimbalzo o modificare le loro tattiche di gioco per migliorare in questa area. Inoltre, l’allenamento potrebbe essere più focalizzato su esercizi che migliorano la capacità di rimbalzo e la posizione sotto il canestro.
Mentre il modello fornisce intuizioni importanti, è essenziale riconoscere le sue limitazioni. Altri fattori, come le capacità di tiro, la difesa, e la strategia di squadra, giocano anch’essi un ruolo cruciale nelle prestazioni complessive. Future analisi potrebbero esplorare l’interazione tra rimbalzi e altri aspetti del gioco per fornire una comprensione ancora più completa delle dinamiche del basket professionistico.